Skip to content

feat(i18n): add multi-language support and implement app internationalization#87

Merged
alecdotdev merged 1 commit intoalecdotdev:masterfrom
maxrks:feat/i18n
Mar 30, 2026
Merged

feat(i18n): add multi-language support and implement app internationalization#87
alecdotdev merged 1 commit intoalecdotdev:masterfrom
maxrks:feat/i18n

Conversation

@maxrks
Copy link
Copy Markdown
Contributor

@maxrks maxrks commented Mar 30, 2026

Complete Internationalization (i18n) Support

Overview

Added comprehensive multi-language internationalization support to the Markpad application, supporting 10 languages with automatic OS language detection.

Supported Languages

Code Language Native Name
en English English
ja Japanese 日本語
zh-CN Chinese (Simplified) 简体中文
zh-TW Chinese (Traditional) 繁體中文
ko Korean 한국어
ru Russian Русский
es Spanish Español
fr French Français
de German Deutsch
pt-BR Portuguese (Brazil) Português (Brasil)

Key Changes

1. Core Translation System (src/lib/utils/i18n.ts)

  • Added LanguageCode type definition supporting 10 language codes
  • Created complete translations object with the following categories:
    • settings - All settings page text
    • menu - Menu items (File, Edit, View, Help, etc.)
    • toast - Toast notifications
    • modal - Dialog text
    • home - Home page text
    • editor - Editor status bar
    • tooltip - Tooltip text
    • theme - Theme options
    • installer/uninstaller - Installer/Uninstaller text
    • tabs - Tab labels
    • common - Common buttons
  • Implemented t() translation function with nested key support
  • Added getSupportedLanguages() function to retrieve supported languages

2. Settings Store (src/lib/stores/settings.svelte.ts)

  • Updated LanguageCode type and SUPPORTED_LANGUAGES array
  • Added detectSystemLanguage() function for automatic OS language detection
  • Auto-detect system language on first launch (using browser navigator.language)
  • Save user-selected language to localStorage

3. Component Updates

TitleBar.svelte

  • Added currentLanguage reactive state
  • Used $effect to sync with settings.language changes
  • All menu items use t() function for translation

Editor.svelte

  • Added uiLanguage reactive state
  • Monaco Editor custom actions (Toggle Minimap, Toggle Word Wrap, etc.) labels support multi-language
  • Command palette action labels internationalized

Settings.svelte

  • All settings page labels and options support multi-language
  • Language dropdown displays native language names
  • Theme options (Follow System/Default Light/Default Dark) support multi-language
  • Word wrap options (Off/Window/Column) support multi-language
  • Import button supports multi-language

Tab.svelte

  • Tab context menu supports multi-language
  • Includes: Close, Close Others, Close Tabs to Right, Rename, Show in Folder, etc.

MarkdownViewer.svelte

  • Right-click context menu supports multi-language
  • Includes: Copy Reference, Save Image As, Save Diagram as SVG, etc.
  • Fixed untranslated menu items like "Copy Reference"

Technical Implementation Details

Svelte 5 Reactivity Pattern

// Using $state and $effect for instant language switching
let currentLanguage = $state(settings.language);

$effect(() => {
    currentLanguage = settings.language;
});

// Translation usage
{t('menu.selectAll', currentLanguage)}

Automatic Language Detection

function detectSystemLanguage(): LanguageCode {
    if (typeof navigator !== 'undefined') {
        const browserLang = navigator.language.toLowerCase();
        if (browserLang.startsWith('zh')) {
            if (browserLang === 'zh-tw' || browserLang === 'zh-hk') return 'zh-TW';
            return 'zh-CN';
        }
        // ... other language detection
    }
    return 'en';
}

Testing Checklist

  • Translation completeness check for 10 languages
  • Language switching takes effect immediately
  • First launch auto-detects system language
  • All settings page options display correctly
  • All menu items (TitleBar, Tab, MarkdownViewer) translated
  • Monaco Editor custom action labels translated
  • Language selection dropdown displays nativeName

Notes

  • macOS native menu bar and Monaco Editor built-in command palette (F1) localization require separate configuration, not covered in this PR
  • Translation text based on professional localization standards to ensure natural expression in each language

Files Modified

  • src/lib/utils/i18n.ts - Core translation system
  • src/lib/stores/settings.svelte.ts - Settings store with language detection
  • src/lib/components/TitleBar.svelte - Title bar menus
  • src/lib/components/Editor.svelte - Editor actions
  • src/lib/components/Settings.svelte - Settings page
  • src/lib/components/Tab.svelte - Tab context menus
  • src/lib/MarkdownViewer.svelte - Markdown viewer context menus

…lization

Add full i18n support for the application, including:
1. Add language selector in settings supporting 10 languages including English and Chinese
2. Add translated text for all UI elements
3. Implement dynamic language switching
4. Add automatic system language detection
5. Enable i18n support for editor, modals, menus and other components
6. Update settings storage to save language preference

Refactor hard-coded text across the app to use translation functions.
@alecdotdev
Copy link
Copy Markdown
Owner

this is great!

@alecdotdev alecdotdev merged commit 1e78b19 into alecdotdev:master Mar 30, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants